package com.lry.basic.algorithm.greedy;

/**
 * @author:刘仁有
 * @desc:
 * @email:953506233@qq.com
 * @data:2019/8/28
 */
//          给定一个非负整数数组，你最初位于数组的第一个位置。
//
//        数组中的每个元素代表你在该位置可以跳跃的最大长度。
//
//        判断你是否能够到达最后一个位置。
//
//        示例 1:
//
//        输入: [2,3,1,1,4]
//        输出: true
//        解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
//
//        示例 2:
//
//        输入: [3,2,1,0,4]
//        输出: false
//        解释: 无论怎样，你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 ， 所以你永远不可能到达最后一个位置。

public class JumpGame {
    public static void main(String[] args) {
        System.out.println(canJump(new int[]{2, 0, 3, 0}));
        System.out.println(minJump(new int[]{2, 0, 3, 4, 5, 1}));
    }
    public static boolean canJump(int[] nums) {
        if(null==nums||nums.length==0||nums.length==1)
        return true;
        int fast = nums[0];
        for(int i=0;i<nums.length-1&&i<=fast;i++){
            if(nums[i]+i>fast)
                fast = nums[i]+i;
            if(fast>=nums.length-1)
                return true;
        }
        return fast>=nums.length-1;
    }

    public static int minJump(int[] nums) {
        int end = 0;
        int maxPosition = 0;
        int steps = 0;
        for(int i = 0; i < nums.length - 1; i++){
            //找能跳的最远的
            maxPosition = Math.max(maxPosition, nums[i] + i);
            if( i == end){ //遇到边界，就更新边界，并且步数加一
                end = maxPosition;
                steps++;
            }
        }
        return steps;
    }
}
